package com.zx.lc.demo;

import com.zx.lc.service.ChatAiModelService;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.response.ChatResponse;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class C2多轮对话 {

    public static void main(String[] args) {
        //test1();
        test2();
    }

    public static void test1() {
        System.out.println("1.没有上下文关联");
        ChatLanguageModel aiModel = ChatAiModelService.getAiModel("qwen2.5:7b");

        System.out.println(aiModel.chat("你好，我是小白？"));
        System.out.println("----");
        System.out.println(aiModel.chat("我叫什么"));
    }

    /**
     * ChatMessage是一个接口，表示聊天消息，它有以下四种实现：
     *
     * UserMessage：     表示用户发送给大模型的消息
     * AiMessage：       表示大模型响应给用户的消息
     * SystemMessage：   也是用户发送给大模型的消息，和UserMessage不同在于，SystemMessage一般是应用程序帮用户设置的，举个例子，假如有一个作家应用，那么“请你扮演一名作家，请帮我写一篇关于春天的作文”，其中“请你扮演一名作家”就是SystemMessage，“请帮我写一篇关于春天的作文”就是UserMessage
     * ToolExecutionResultMessage：也是用户发送给大模型的，表示工具的执行结果，关于LangChain4j的工具机制，会在后续介绍，目前可以忽略
     */
    public static void test2() {
        System.out.println("2.上下文关联");
        ChatLanguageModel aiModel = ChatAiModelService.getAiModel("qwen2.5:7b");

        // 使用UserMessage关联上下文
        List<ChatMessage> messageList = new ArrayList<>();
        SystemMessage systemMessage = SystemMessage.from("你是我的私人管家，帮我完成工作");
        messageList.add(systemMessage);

        System.out.println("第一轮");
        UserMessage userMessage = UserMessage.from("你好，我是小白？");
        messageList.add(userMessage);

        ChatResponse chatResponse = aiModel.chat(messageList);
        log.info("{}, {}", chatResponse.aiMessage().text(), chatResponse.tokenUsage().toString());

        System.out.println("第二轮");
        userMessage = UserMessage.userMessage("我叫什么？");
        messageList.add(userMessage);

        chatResponse = aiModel.chat(messageList);
        log.info("{}, {}", chatResponse.aiMessage().text(), chatResponse.tokenUsage().toString());

    }
}
